package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

/*
1、编写一个程序，将一个文件的内容，写入到另外一个文件
注：这两个文件已经存在了
说明：使用ioutil.ReadFile/ioutil.WriteFile完成写文件的任务
2、判断文件是否文件
go判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断：
(1)如果返回的错误为nil，说明文件或文件夹存在
(2)如果返回的错误类型使用os.IsNotExist()判断为true，说明文件或文件夹不存在
(3)如果返回的错误为其它类型，则不确定是否存在
func Stat(name string) (fi FileInfo, err error)
Stat返回一个描述name指定的文件对象的FileInfo。
如果指定的文件对象是一个符号链接，返回的FileInfo描述该符号链接指向的文件的信息，本函数会尝试跳转该链接。
如果出错，返回的错误值为*PathError类型。
*/
//判断文件或目录是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil { //文件或目录存在
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
func main() {
	//将abc.txt文件内容导入到kkk.txt
	//1、首先将abc.txt内容读取到内存
	//2、将读取到内容写入kkk.txt
	file1Path := "src/go_code/chapter14/6判断文件或目录存在/abc.txt"
	file2Path := "src/go_code/chapter14/6判断文件或目录存在/kkk.txt"
	if ok, err := PathExists(file1Path); ok {
		fmt.Println("文件存在", err)
	}
	data, err := ioutil.ReadFile(file1Path)
	if err != nil {
		//说明读取文件有错误
		fmt.Printf("read file err=%v\n", err)
		return
	}
	/*
		func WriteFile(filename string, data []byte, perm os.FileMode) error
		函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件，否则在写入数据之前清空文件。
	*/
	err = ioutil.WriteFile(file2Path, data, 0600)
	if err != nil {
		fmt.Printf("write file error=%v\n", err)
	}
}
